/**
 * 
 */
package algorithme;

import programme.Portefeuille;
import programme.PortefeuilleDeterministe;
import programme.Solution;
import voisinages.ComplementAlpha;
import voisinages.Voisinage;

/**
 * @author port
 *
 */
public class RecuitSimule_PF extends RecuitSimule<Portefeuille> {

	
	public RecuitSimule_PF(Portefeuille p, double temperature, double mu, int nbIterInterne, int nbPalier){
		this.prog = p;
		this.glouton = new Glouton_PF<PortefeuilleDeterministe>(prog);
		this.temperature = temperature;
		this.mu = mu;
		this.nbIterInterne = nbIterInterne;
		this.nbPalier = nbPalier;
	}
	
	public Solution lancer() {
		int i, j;
		double deltaf;
		double resX;
		i = 0;
		j=0;
		meilleurX = glouton.lancer();
		Solution X = meilleurX;
		
		meilleurResultat = prog.getObjectif().eval(meilleurX);
		resX = meilleurResultat;
		while (i < nbIterInterne){
			while(j < nbPalier){
				Voisinage voisinage = new ComplementAlpha(prog);
				Solution newX = voisinage.mouvement(meilleurX, 2);
				deltaf = prog.getObjectif().eval(newX) - resX;
				if (deltaf < 0){
					X = newX;
					resX = prog.getObjectif().eval(newX);
					if(resX < meilleurResultat){
						meilleurX = X;
						meilleurResultat = resX;
					}
				} else {
					double alea = Math.random();
					if (alea <= Math.exp(deltaf/temperature)){
						X = newX;
						resX = prog.getObjectif().eval(newX);
					}
				}
				j ++ ;
			}
			i ++;
			temperature = this.g(temperature);
		}
		meilleurX.setResultat(prog.getObjectif().eval(meilleurX));
		return meilleurX;
	}
}
